package com.ease.platform.authorization.util;

import com.ease.common.util.Detect;
import com.ease.model.criterion.QueryCriteria;
import com.ease.platform.usercontext.vo.UserContext;

public abstract class AuthorizationUtil extends Detect {

	// private static final String RegionConstraintSqlFragment =
	// "ID IN(SELECT DISTINCT(ID) FROM C_REGION R CONNECT BY NOCYCLE PRIOR R.PARENTREGION_ID=R.ID START WITH ID IN (?) "
	// +
	// " UNION SELECT DISTINCT(ID) FROM C_REGION R CONNECT BY NOCYCLE PRIOR R.ID=R.PARENTREGION_ID START WITH ID IN (?))";
	//
	// private static boolean isGroup(String groupCode, UserContext userContext)
	// {
	// List<Role> groups = userContext.getGroups();
	//
	// if (null != groups) {
	// for (Role group : groups) {
	// if (groupCode.equals(group.getCode())) {
	// return true;
	// }
	// }
	// }
	// return false;
	// }
	//
	// public static boolean isAdministrator(UserContext userContext) {
	// return isGroup(Role.Administrator, userContext);
	// }
	//
	// public static boolean isManager(UserContext userContext) {
	// return isGroup(Role.Manager, userContext);
	// }
	//
	// private static Map<String, Object> safeParameters(Map<String, Object>
	// parameters) {
	// if (null == parameters) {
	// parameters = new HashMap<String, Object>();
	// }
	// return parameters;
	// }
	//
	// private static QueryCriteria safeParameters(QueryCriteria queryCriteria){
	// if (null == queryCriteria) {
	// queryCriteria = new EntityQueryCriteria();
	// }
	// return queryCriteria;
	// }
	//
	// public static Map<String,Object> appendSpecialyTypeParameter(Class
	// entityClass, Map<String, Object> parameter,
	// UserContext userContext){
	//
	// // Assertion.notNull(userContext,
	// "<<appendSpecialyTypeParameter>>userContext not found" );
	// // if(isAdministrator(userContext)||isManager(userContext)){
	// // return parameter;
	// // }
	// // AuthorizationContext authorizationContext =
	// AuthorizationContext.getAuthorizationContext();
	// // if (null != authorizationContext) {
	// // if(!specialtyTypeSupport(authorizationContext.getOperation())){
	// // return parameter;
	// // }
	// // parameter = safeParameters(parameter);
	// // if (null != authorizationContext &&
	// SpecialtyTypeSupport.class.isAssignableFrom(entityClass)) {
	// // List<Authorization> authorizations =
	// authorizationContext.getAuthorizations();
	// // long[] specialtyTypeIds = new long[] { -1 };
	// // if (notEmpty(authorizations)) {
	// // for (Authorization authorization : authorizations) {
	// // Role group = DataAccessObjectUtil.getById(authorization.getGroupId(),
	// userContext.getGroups());
	// // if (null != group && notEmpty(group.getMaintainenceSpcialtyTypes())) {
	// // specialtyTypeIds = ArrayUtils.addAll(specialtyTypeIds,
	// DataAccessObjectUtil.idOf(group.getMaintainenceSpcialtyTypes()));
	// // }
	// // }
	// // if (notEmpty(specialtyTypeIds)) {
	// //
	// // }
	// // }
	// //
	// parameter.put(SpecialtyTypeSupport.Attribute_maintenanceSpecialtyTypeIds,
	// specialtyTypeIds);
	// // }
	// // }
	// // return parameter;
	// return null;
	// }
	//
	// // private static boolean specialtyTypeSupport(Operation operation){
	// // boolean specialtyTypeSupport=false;
	// // if(null!=operation){
	// // PermissionDimensionType
	// permissionDimensionType=operation.getPermissionDimensionType();
	// // switch (permissionDimensionType) {
	// // case LocationDimension:
	// //
	// // break;
	// // case SpecialtyDimension:
	// //
	// // break;
	// // case UserLocationDimension:
	// //
	// // break;
	// // case UserSpecialtyDimension:
	// // // TODO compare with user's specialty
	// //
	// // break;
	// // case UserLocationSpecialtyDimension:
	// // // TODO compare with user's location & specialty
	// //
	// // break;
	// // case GroupLocationDimension:
	// // // TODO compare with user's location
	// //
	// // break;
	// // case GroupSpecialtyDimension:
	// // specialtyTypeSupport=true;
	// // break;
	// // case GroupLocationSpecialtyDimension:
	// //
	// //
	// // break;
	// // case UserLocationGroupSpecialtyDimension:
	// // specialtyTypeSupport=true;
	// // break;
	// // }
	// // }
	// // return specialtyTypeSupport;
	// // }
	// //
	@SuppressWarnings("unchecked")
	public static QueryCriteria appendSpecialyTypeParameter(Class entityClass, QueryCriteria queryCriteria, UserContext userContext) {
		// Assertion.notNull(userContext,
		// "<<appendSpecialyTypeParameter>>userContext not found" );
		// if(isAdministrator(userContext)||isManager(userContext)){
		// return queryCriteria;
		// }
		// queryCriteria=safeParameters(queryCriteria);
		// AuthorizationContext authorizationContext =
		// AuthorizationContext.getAuthorizationContext();
		// if (null!=authorizationContext&&SpecialtyTypeSupport.class.
		// isAssignableFrom(entityClass)) {
		// List<Authorization> authorizations =
		// authorizationContext.getAuthorizations();
		// if (notEmpty(authorizations)) {
		// long[] specialtyTypeIds = new long[] {};
		// for (Authorization authorization : authorizations) {
		// Role group = DataAccessObjectUtil.getById(authorization.getGroupId(),
		// userContext.getGroups());
		// if (null != group && notEmpty(group.getMaintainenceSpcialtyTypes()))
		// {
		// specialtyTypeIds = ArrayUtils.addAll(specialtyTypeIds,
		// DataAccessObjectUtil.idOf(group.getMaintainenceSpcialtyTypes()));
		// }
		// }
		// if(notEmpty(specialtyTypeIds))
		// queryCriteria.add(Restrictions.in(SpecialtyTypeSupport.
		// Attribute_specialtyTypeId,Arrays.asList(ArrayUtils.
		// toObject(specialtyTypeIds))));
		//
		// }
		// }
		return queryCriteria;
	}

	//
	// // public static Map<String, Object> appendRegionParameterForIbatis(Class
	// entityClass, Map<String, Object>
	// parameter, UserContext userContext) {
	// // Assertion.notNull(userContext,
	// "<<appendSpecialyTypeParameter>>userContext not found" );
	// // if(isAdministrator(userContext)||isManager(userContext)){
	// // return parameter;
	// // }
	// // parameter=safeParameters(parameter);
	// // if (notEmpty(userContext.getMaintenanceRegions())) {
	// //
	// //
	// if(entityClass.getSimpleName().equals(MetaEntityTypeCodeConst.Region)){
	// // parameter.put(RegionCriteria.Attribute_maintainanceRegionIds,
	// DataAccessObjectUtil.idOf(userContext.getMaintenanceRegions()));
	// // return parameter;
	// // }
	// //
	// // RegionAuthorizationContext regionAuthorizationContext =
	// toRegionAuthorizationContext(userContext.getMaintenanceRegions());
	// // if (ProvinceEntitySupport.class.isAssignableFrom(entityClass)) {
	// // if (notEmpty(regionAuthorizationContext.getProvinceIds())) {
	// // parameter.put(ProvinceEntitySupport.Attribute_maintenanceProvinceIds,
	// regionAuthorizationContext.getProvinceIds());
	// // }
	// // }
	// // if (PrefectureEntitySupport.class.isAssignableFrom(entityClass)) {
	// // if (notEmpty(regionAuthorizationContext.getPrefectureIds())) {
	// //
	// parameter.put(PrefectureEntitySupport.Attribute_maintenancePrefectureIds,
	// regionAuthorizationContext.getPrefectureIds());
	// // }
	// // }
	// // if (CountyEntitySupport.class.isAssignableFrom(entityClass)) {
	// // if (notEmpty(regionAuthorizationContext.getCountyIds())) {
	// // parameter.put(CountyEntitySupport.Attribute_maintenanceCountyIds,
	// regionAuthorizationContext.getCountyIds());
	// // }
	// // }
	// // if (TownshipEntitySupport.class.isAssignableFrom(entityClass)) {
	// // if (notEmpty(regionAuthorizationContext.getTownshipIds())) {
	// // parameter.put(TownshipEntitySupport.Attribute_maintenanceTownshipIds,
	// regionAuthorizationContext.getTownshipIds());
	// // }
	// // }
	// // }
	// // return parameter;
	// return null;
	// }
	//
	public static QueryCriteria appendRegionParameter(Class<?> entityClass, QueryCriteria queryCriteria, UserContext userContext) {
		// Assertion.notNull(userContext, "<<appendSpecialyTypeParameter>>userContext not found");
		// if (isAdministrator(userContext) || isManager(userContext)) {
		// return queryCriteria;
		// }
		// queryCriteria = safeParameters(queryCriteria);
		// if (notEmpty(userContext.getMaintenanceRegions())) {
		//
		// if (entityClass.getSimpleName().equals(MetaEntityTypeCodeConst.Region)) {
		// List<Long> maintenanceRegionIds =
		// Arrays.asList(ArrayUtils.toObject(DataAccessObjectUtil.idOf(userContext.getMaintenanceRegions())));
		// queryCriteria.add(Restrictions.sqlRestriction(RegionConstraintSqlFragment, new String[] {
		// RegionCriteria.Attribute_maintainanceRegionIds,
		// RegionCriteria.Attribute_maintainanceRegionIds }, new Object[] { maintenanceRegionIds, maintenanceRegionIds
		// }));
		// return queryCriteria;
		// }
		//
		// RegionAuthorizationContext regionAuthorizationContext =
		// toRegionAuthorizationContext(userContext.getMaintenanceRegions());
		// if (ProvinceEntitySupport.class.isAssignableFrom(entityClass)) {
		// if (notEmpty(regionAuthorizationContext.getProvinceIds())) {
		// queryCriteria.add(Restrictions.in(ProvinceEntitySupport.Column_PROVINCE_ID,
		// ArrayUtils.toObject(regionAuthorizationContext.getProvinceIds())));
		// }
		// }
		// if (PrefectureEntitySupport.class.isAssignableFrom(entityClass)) {
		// if (notEmpty(regionAuthorizationContext.getPrefectureIds())) {
		// queryCriteria.add(Restrictions.in(PrefectureEntitySupport.Column_PREFECTURE_ID,
		// ArrayUtils.toObject(regionAuthorizationContext.getPrefectureIds())));
		// }
		// }
		// if (CountyEntitySupport.class.isAssignableFrom(entityClass)) {
		// if (notEmpty(regionAuthorizationContext.getCountyIds())) {
		// queryCriteria.add(Restrictions.in(CountyEntitySupport.Column_COUNTY_ID,
		// ArrayUtils.toObject(regionAuthorizationContext.getCountyIds())));
		// }
		// }
		// if (TownshipEntitySupport.class.isAssignableFrom(entityClass)) {
		// if (notEmpty(regionAuthorizationContext.getTownshipIds())) {
		// queryCriteria.add(Restrictions.in(TownshipEntitySupport.Column_TOWNSHIP_ID,
		// ArrayUtils.toObject(regionAuthorizationContext.getTownshipIds())));
		// }
		// }
		// }
		return queryCriteria;
	}
	//
	// public static RegionAuthorizationContext
	// toRegionAuthorizationContext(List<Region> regions) {
	// // RegionAuthorizationContext regionAuthorizationContext = new
	// RegionAuthorizationContext();
	// // regionAuthorizationContext.setRegions(regions);
	// //
	// // long[] provinceIds = new long[] {};
	// // long[] prefectureIds = new long[]{};
	// // long[] countyIds = new long[] {};
	// // long[] townshipIds = new long[] {};
	// // if (Detect.notEmpty(regions)) {
	// // for (Region region : regions) {
	// // if (Detect.isPositive(region.getProvinceId()))
	// // provinceIds = ArrayUtils.add(provinceIds, region.getProvinceId());
	// // if (Detect.isPositive(region.getPrefectureId()))
	// // prefectureIds = ArrayUtils.add(prefectureIds,
	// region.getPrefectureId());
	// // if (Detect.isPositive(region.getCountyId()))
	// // countyIds = ArrayUtils.add(countyIds, region.getCountyId());
	// // if (Detect.isPositive(region.getTownshipId()))
	// // townshipIds = ArrayUtils.add(townshipIds, region.getTownshipId());
	// // }
	// // }
	// // regionAuthorizationContext.setProvinceIds(provinceIds);
	// // regionAuthorizationContext.setPrefectureIds(prefectureIds);
	// // regionAuthorizationContext.setCountyIds(countyIds);
	// // regionAuthorizationContext.setTownshipIds(townshipIds);
	// // return regionAuthorizationContext;
	// // }
	// return null;
	// }
}